cssvalue: Implement dependency tracking for gradients
authorBenjamin Otte <otte@redhat.com>
Mon, 27 Aug 2012 16:39:46 +0000 (18:39 +0200)
committerBenjamin Otte <otte@redhat.com>
Tue, 28 Aug 2012 13:42:25 +0000 (15:42 +0200)
gtk/gtkcssstylefuncs.c
gtk/gtkgradient.c
gtk/gtkstylepropertiesprivate.h

index 8478ba3ec29965aeaa69361769386dac726637ef..0320e0adc45faa1153991c0d9a5a514a55b6bf6c 100644 (file)
@@ -34,6 +34,7 @@
 #include "gtkgradient.h"
 #include "gtkprivatetypebuiltins.h"
 #include "gtkstylecontextprivate.h"
+#include "gtkstylepropertiesprivate.h"
 #include "gtksymboliccolorprivate.h"
 #include "gtkthemingengine.h"
 #include "gtktypebuiltins.h"
@@ -830,9 +831,7 @@ pattern_value_compute (GtkStyleContext    *context,
       GValue new_value = G_VALUE_INIT;
       cairo_pattern_t *gradient;
       
-      *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING;
-
-      gradient = gtk_gradient_resolve_for_context (g_value_get_boxed (value), context);
+      gradient = _gtk_gradient_resolve_full (g_value_get_boxed (value), context, dependencies);
 
       g_value_init (&new_value, CAIRO_GOBJECT_TYPE_PATTERN);
       g_value_take_boxed (&new_value, gradient);
index 9743654b6c5b2df87a4fe40228a2b6a300c75ffc..ba4e30340b39fff04d3dfcea76c38e1a589470d5 100644 (file)
@@ -281,14 +281,16 @@ gtk_gradient_resolve (GtkGradient         *gradient,
 }
 
 cairo_pattern_t *
-gtk_gradient_resolve_for_context (GtkGradient     *gradient,
-                                  GtkStyleContext *context)
+_gtk_gradient_resolve_full (GtkGradient        *gradient,
+                            GtkStyleContext    *context,
+                            GtkCssDependencies *dependencies)
 {
   cairo_pattern_t *pattern;
   guint i;
 
-  g_return_val_if_fail (gradient != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), FALSE);
+  g_return_val_if_fail (gradient != NULL, NULL);
+  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
+  g_return_val_if_fail (*dependencies == 0, NULL);
 
   if (gradient->radius0 == 0 && gradient->radius1 == 0)
     pattern = cairo_pattern_create_linear (gradient->x0, gradient->y0,
@@ -303,13 +305,15 @@ gtk_gradient_resolve_for_context (GtkGradient     *gradient,
     {
       ColorStop *stop;
       GdkRGBA rgba;
+      GtkCssDependencies stop_deps;
 
       stop = &g_array_index (gradient->stops, ColorStop, i);
 
       /* if color resolving fails, assume transparency */
-      if (!_gtk_style_context_resolve_color (context, stop->color, &rgba, NULL))
+      if (!_gtk_style_context_resolve_color (context, stop->color, &rgba, &stop_deps))
         rgba.red = rgba.green = rgba.blue = rgba.alpha = 0.0;
 
+      *dependencies = _gtk_css_dependencies_union (*dependencies, stop_deps);
       cairo_pattern_add_color_stop_rgba (pattern, stop->offset,
                                          rgba.red, rgba.green,
                                          rgba.blue, rgba.alpha);
@@ -318,6 +322,18 @@ gtk_gradient_resolve_for_context (GtkGradient     *gradient,
   return pattern;
 }
 
+cairo_pattern_t *
+gtk_gradient_resolve_for_context (GtkGradient     *gradient,
+                                  GtkStyleContext *context)
+{
+  GtkCssDependencies ignored = 0;
+
+  g_return_val_if_fail (gradient != NULL, NULL);
+  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
+
+  return _gtk_gradient_resolve_full (gradient, context, &ignored);
+}
+
 static void
 append_number (GString    *str,
                double      d,
index c5b742e7917602e960c86c26fb648ccdf42dd707..d459307cd7f17a603b555d52d8df7623f111cfd5 100644 (file)
@@ -33,6 +33,11 @@ void           _gtk_style_properties_set_property_by_property (GtkStylePropertie
                                                                GtkStateFlags            state,
                                                                GtkCssValue             *value);
 
+cairo_pattern_t *
+              _gtk_gradient_resolve_full  (GtkGradient         *gradient,
+                                           GtkStyleContext     *context,
+                                           GtkCssDependencies  *dependencies);
+
 G_END_DECLS
 
 #endif /* __GTK_STYLE_PROPERTIES_PRIVATE_H__ */